import G6, { Graph, TreeGraph } from '../../src';

const div = document.createElement('div');
div.id = 'container';
document.body.appendChild(div);

describe('dragenter dragleave', () => {
  const data = {
    nodes: [{
      id: 'node1',
      x: 100,
      y: 100
    }, {
      id: 'node2',
      x: 200,
      y: 100
    }],
    edges: []
  };
  const graph = new Graph({
    container: 'container',
    width: 500,
    height: 500,
    modes: {
      default: ['drag-node']
    }
  });
  graph.data(data);
  graph.render();
  it('dragenter', () => {
    graph.on('node:dragenter', e => {
      console.log('dragenter')
    });
    graph.on('node:dragleave', e => {
      console.log('dragleave')
    });
    graph.on('node:mouseenter', e => {
      console.log('mouseenter')
    });
    graph.on('node:mouseleave', e => {
      console.log('mouseleave')
    });
    graph.on('node:dragover', e => {
      console.log('dragover')
    });
  });
  graph.destroy();
});

// closes: #1026
describe('empty data array + fitview', () => {
  const data = {
    nodes: [],
    edges: []
  };
  const graph = new Graph({
    container: 'container',
    width: 500,
    height: 500,
    fitView: true
  });
  graph.data(data);
  it('empty data array + fitview', () => {
    graph.render();
    graph.destroy()
  });
});



// closes: #1301
describe('change data with rect node', () => {
  const data = {
    nodes: [{
      name: "source",
      id: "source",
      label: "source",
      type: 'rect',
      x: 100,
      y: 100,
      //size: [60, 60],
      style: {
        width: 60,
        height: 20,
      }
    }],
    edges: []
  };
  const graph = new Graph({
    container: 'container',
    width: 500,
    height: 500
  });
  graph.data(data);
  it('change data', () => {
    graph.render();
    graph.changeData(data);
    graph.destroy()
  });
});


describe('cubic with layout', () => {
  const data = {
    nodes: [
      {
        id: '1',
        label: '冲压',
        degree: 1,
        // x: 0,
        // y: 0
        // x: 100,
        // y: 300
      },
      {
        id: '2',
        label: '电镀',
        degree: 2,
        // x: 0,
        // y: 0
        // x: 600,
        // y: 300
      }
    ],
    edges: [
      {
        source: '1',
        target: '2',
      }
    ]
  };
  const dashArray = [
    [0, 1],
    [0, 2],
    [1, 2],
    [0, 1, 1, 2],
    [0, 2, 1, 2],
    [1, 2, 1, 2],
    [2, 2, 1, 2],
    [3, 2, 1, 2],
    [4, 2, 1, 2]
  ];
  
  const lineDash = [4, 2, 1, 2];
  const interval = 9; // lineDash 的和
  G6.registerEdge('line-dash', {
    afterDraw(cfg, group) {
      // 获得该边的第一个图形，这里是边的 path
      const shape = group.get('children')[0];
      // 获得边的 path 的总长度
      const length = shape.getTotalLength();
      
      let totalArray = [];
      // 计算出整条线的 lineDash
      for (let i = 0; i < length; i += interval) {
        totalArray = totalArray.concat(lineDash);
      }
  
      let index = 0;
      // 边 path 图形的动画
      shape.animate((ratio) => {
        const cfg = {
            lineDash: dashArray[index].concat(totalArray)
          };
        // 每次移动 1
        index = (index + 1) % interval;
        // 返回需要修改的参数集，这里只修改了 lineDash
        return cfg;
      }, {
        repeat: true,
        duration: 3000
      });  // 一次动画的时长为 3000
    }
  }, 'cubic');   // 该自定义边继承了内置三阶贝塞尔曲线边 cubic
  const graph = new Graph({
    container: 'container',
    width: 500,
    height: 500,
    //animate: true,
    defaultEdge: {
      size: 2,
      type: 'line-dash',//'line',//'line-dash',//
      color: '#e2e2e2'
    },
    layout: {
      type: 'dagre',
      rankdir: 'LR',
      nodesep: 30,
      //controlPoints: false
      // ranksep: 100
    }
  });
  it('change data', () => {
    graph.data(data);
    graph.render();
    graph.destroy()
  });
});

describe('changdata states', () => {
  it('changeData', () => {
    const data = {
      nodes: [
        {
          id: "0",
          label: "0"
        },
        {
          id: "1",
          label: "1"
        },
        {
          id: "2",
          label: "2"
        },
        {
          id: "3",
          label: "3"
        },
        {
          id: "4",
          label: "4"
        },
        {
          id: "5",
          label: "5"
        },
        {
          id: "6",
          label: "6"
        },
        {
          id: "7",
          label: "7"
        },
        {
          id: "8",
          label: "8"
        },
        {
          id: "9",
          label: "9"
        },
        {
          id: "10",
          label: "10"
        },
        {
          id: "11",
          label: "11"
        },
        {
          id: "12",
          label: "12"
        },
        {
          id: "13",
          label: "13"
        },
        {
          id: "14",
          label: "14"
        },
        {
          id: "15",
          label: "15"
        },
        {
          id: "16",
          label: "16"
        },
        {
          id: "17",
          label: "17"
        },
        {
          id: "18",
          label: "18"
        },
        {
          id: "19",
          label: "19"
        },
        {
          id: "20",
          label: "20"
        },
        {
          id: "21",
          label: "21"
        },
        {
          id: "22",
          label: "22"
        },
        {
          id: "23",
          label: "23"
        },
        {
          id: "24",
          label: "24"
        },
        {
          id: "25",
          label: "25"
        },
        {
          id: "26",
          label: "26"
        },
        {
          id: "27",
          label: "27"
        },
        {
          id: "28",
          label: "28"
        },
        {
          id: "29",
          label: "29"
        },
        {
          id: "30",
          label: "30"
        },
        {
          id: "31",
          label: "31"
        },
        {
          id: "32",
          label: "32"
        },
        {
          id: "33",
          label: "33"
        }
      ],
      edges: [
        {
          source: "0",
          target: "1"
        },
        {
          source: "0",
          target: "2"
        },
        {
          source: "0",
          target: "3"
        },
        {
          source: "0",
          target: "4"
        },
        {
          source: "0",
          target: "5"
        },
        {
          source: "0",
          target: "7"
        },
        {
          source: "0",
          target: "8"
        },
        {
          source: "0",
          target: "9"
        },
        {
          source: "0",
          target: "10"
        },
        {
          source: "0",
          target: "11"
        },
        {
          source: "0",
          target: "13"
        },
        {
          source: "0",
          target: "14"
        },
        {
          source: "0",
          target: "15"
        },
        {
          source: "0",
          target: "16"
        },
        {
          source: "2",
          target: "3"
        },
        {
          source: "4",
          target: "5"
        },
        {
          source: "4",
          target: "6"
        },
        {
          source: "5",
          target: "6"
        },
        {
          source: "7",
          target: "13"
        },
        {
          source: "8",
          target: "14"
        },
        {
          source: "9",
          target: "10"
        },
        {
          source: "10",
          target: "22"
        },
        {
          source: "10",
          target: "14"
        },
        {
          source: "10",
          target: "12"
        },
        {
          source: "10",
          target: "24"
        },
        {
          source: "10",
          target: "21"
        },
        {
          source: "10",
          target: "20"
        },
        {
          source: "11",
          target: "24"
        },
        {
          source: "11",
          target: "22"
        },
        {
          source: "11",
          target: "14"
        },
        {
          source: "12",
          target: "13"
        },
        {
          source: "16",
          target: "17"
        },
        {
          source: "16",
          target: "18"
        },
        {
          source: "16",
          target: "21"
        },
        {
          source: "16",
          target: "22"
        },
        {
          source: "17",
          target: "18"
        },
        {
          source: "17",
          target: "20"
        },
        {
          source: "18",
          target: "19"
        },
        {
          source: "19",
          target: "20"
        },
        {
          source: "19",
          target: "33"
        },
        {
          source: "19",
          target: "22"
        },
        {
          source: "19",
          target: "23"
        },
        {
          source: "20",
          target: "21"
        },
        {
          source: "21",
          target: "22"
        },
        {
          source: "22",
          target: "24"
        },
        {
          source: "22",
          target: "25"
        },
        {
          source: "22",
          target: "26"
        },
        {
          source: "22",
          target: "23"
        },
        {
          source: "22",
          target: "28"
        },
        {
          source: "22",
          target: "30"
        },
        {
          source: "22",
          target: "31"
        },
        {
          source: "22",
          target: "32"
        },
        {
          source: "22",
          target: "33"
        },
        {
          source: "23",
          target: "28"
        },
        {
          source: "23",
          target: "27"
        },
        {
          source: "23",
          target: "29"
        },
        {
          source: "23",
          target: "30"
        },
        {
          source: "23",
          target: "31"
        },
        {
          source: "23",
          target: "33"
        },
        {
          source: "32",
          target: "33"
        }
      ]
    };
    
    const width = 500;
    const height = 500;
    const graph = new G6.Graph({
      container: "container",
      width,
      height,
      modes: {
        default: ["activate-relations", "drag-canvas", "drag-node"]
      },
      layout: {
        type: "circular"
      },
      edgeStateStyles: {
        active: {
          stroke: '#000',
          opacity: 1,
        },
        inactive: {
          color: '#969696',
          opacity: 0.5,
        },
      },
      animate: true,
      defaultNode: {
        size: 20,
        style: {
          lineWidth: 2,
          fill: "#C6E5FF",
          stroke: "#5B8FF9"
        }
      },
      defaultEdge: {
        size: 1,
        color: "#e2e2e2",
        style: {
          endArrow: {
            path: "M 0,0 L 8,4 L 8,-4 Z",
            fill: "#e2e2e2"
          }
        }
      }
    });
    graph.data(data);
    graph.render();
    
    const node1 = graph.findById('1')
    graph.setItemState(node1, 'active', true)
    const edge1 =  graph.getEdges()[0]
    graph.setItemState(edge1, 'active', true)

    expect(graph.findAllByState('node', 'active').length).toBe(1)
    expect(graph.findAllByState('edge', 'active').length).toBe(1)

    graph.changeData(data)
    expect(graph.findAllByState('node', 'active').length).toBe(0)
    expect(graph.findAllByState('edge', 'active').length).toBe(0)

    graph.destroy()
  })
})

describe('defaultStyle states', () => {
  it('label', () => {
    const data = {
      nodes: [
        {
          id: 'node1',
          label: 'node1',
          x: 100,
          y: 100
        }
      ]
    }

    const graph = new G6.Graph({
      container: 'container',
      width: 500,
      height: 500,
      defaultEdge: {
        color: '#e2e2e2',
        lineAppendWidth: 3,
        
      },
      defaultNode: {
        style: {
          fill: '#DEE9FF',
          stroke: '#5B8FF9'
        },
      },
      nodeStateStyles: {
        hover: {
          lineWidth: 5,
          fillOpacity: 1,
          'text-shape': {
            fontSize: 20,
            fill: '#003a8c'
          },
        },
      },
      edgeStateStyles: {
        hover: {
          lineWidth: 3,
        },
      },
    });
    graph.data(data);
    graph.render();
    
    graph.on('node:mouseenter', function(evt) {
      const node = evt.item;
      const model = node.getModel();
      model.oriLabel = model.label;
      graph.setItemState(node, 'hover', true);
      graph.updateItem(node, {
        label: 'hover 后 ' + model.id,
        labelCfg: {
          style: {
            fill: 'blue'
          },
        },
      });
    });
    
    graph.on('node:mouseleave', function(evt) {
      const node = evt.item;
      const model = node.getModel();
      
      graph.setItemState(node, 'hover', false);
      
      graph.updateItem(node, {
        label: model.oriLabel,
        style: {
          'text-shape': {
            fill: 'red'
          },
        },
        labelCfg: {
          style: {
            fill: 'red'
          },
        },
      });

    });
    
    graph.on('edge:mouseenter', function(evt) {
      const edge = evt.item;
      const model = edge.getModel();
      model.oriLabel = model.label;
      graph.setItemState(edge, 'hover', true);
      graph.updateItem(edge, {
        label: 'hover 后',
        labelCfg: {
          style: {
            fill: '#003a8c',
          },
        },
      });
    });
    
    graph.on('edge:mouseleave', function(evt) {
      const edge = evt.item;
      graph.setItemState(edge, 'hover', false);
      graph.updateItem(edge, {
        label: 'hover 前的边文本',
        labelCfg: {
          style: {
            fill: '#555',
          },
        },
      });
    });

    // graph.destroy()
  })
})